﻿package com.Galaxisfarm {
	// Bibliotecas da game engine Flixel
	import com.adamatomic.flixel.*;
	// Utilitários
	import flash.utils.*;
	import flash.geom.Point;
	
	public class Midden extends FlxSprite {
		// Sprite da esterqueira
		[Embed(source = "../../data/midden.png")] private var ImgMidden:Class;
		
		// Imagem do sprite selecionado
		private var _selected:FlxSprite;
		// Indica se o objeto está selecionado
		private var _is_selected:Boolean;
		// Estado
		private var _state:int = 0;
		// Dinheiro ganho quando a esterqueira estiver cheia de esterco
		private var _price_on_clean:Number;
		// Conta quantas vezes a esterqueira foi limpa
		private var _clean_count:int = 0;
		// Pontos de colisão
		private var _collide_points:FlxArray;
		// Posição do mouse
		private var _mouse_point:Point = null;
		
		// Método construtor
		public function Midden(X:Number, Y:Number, MousePoint:Point = null):void {
			// Carrega o sprite
			super(ImgMidden, X, Y, false, false, 86, 52);
			
			// Define as animações
			addAnimation("normal", [0]);
			addAnimation("1", [1]);
			addAnimation("2", [2]);
			addAnimation("3", [3]);
			addAnimation("4", [4]);
			addAnimation("5", [5]);
			addAnimation("6", [6]);
			addAnimation("7", [7]);
			addAnimation("8", [8]);
			addAnimation("9", [9]);
			addAnimation("10", [10]);
			addAnimation("11", [11]);
			addAnimation("12", [12]);
			addAnimation("13", [13]);
			addAnimation("selected", [14]);
			addAnimation("not", [15]);
			
			_selected = null;
			
			// Inicialmente é definido como não selecionado
			_is_selected = false;
			
			// Dinheiro ganho quando limpar a esterqueira
			_price_on_clean = 200;
			
			// Define os valores inicias para os pontos de colisões
			_collide_points = new FlxArray;
			_collide_points[1] = null;
			_collide_points[2] = null;
			_collide_points[3] = null;
			_collide_points[4] = null;
			_collide_points[5] = null;
			_collide_points[6] = null;
			_collide_points[7] = null;
			_collide_points[8] = null;
			
			// Define a posição do mouse, caso seja passada como parâmetro
			if (MousePoint != null) {
				_mouse_point = MousePoint;
				this.x = _mouse_point.x - this.width / 2;
				this.y = _mouse_point.y - this.height / 2;
			}
		}
		
		// Método chamado constantemente
		// redefine os pontos de colisão
		override public function update():void {
			// Se existe os pontos do mouse
			// atualiza os pontos de colisão
			if (_mouse_point != null) {
				var cursor_x:Number = _mouse_point.x - this.width / 2;
				var cursor_y:Number = _mouse_point.y - this.height / 2;
				
				// Pontos de colisão da esterqueira				
				_collide_points[1] = new Point(cursor_x + -1, cursor_y + 25);
				_collide_points[2] = new Point(cursor_x + 18, cursor_y + 7);
				_collide_points[3] = new Point(cursor_x + 42, cursor_y + -1);
				_collide_points[4] = new Point(cursor_x + 65, cursor_y + 7);
				_collide_points[5] = new Point(cursor_x + 85, cursor_y + 26);
				_collide_points[6] = new Point(cursor_x + 70, cursor_y + 42);
				_collide_points[7] = new Point(cursor_x + 43, cursor_y + 51);
				_collide_points[8] = new Point(cursor_x + 15, cursor_y + 42);
			}
		}
		
		// Atualiza a posição do sprint pelo deslocamento
		// do mouse
		public function updatePositionByMouse():void {
			if (_mouse_point != null) {
				this.x = _mouse_point.x - this.width / 2;
				this.y = _mouse_point.y - this.height / 2;
			}
		}
		
		// Obtém os pontos de colisão
		public function getCollidePoints():FlxArray {
			return _collide_points;
		}
		
		// Quantidade de vezes que a esterqueira foi limpa
		public function getCleanCount():int {
			return _clean_count;
		}
		
		// Define o saldo ganho ao limpar a esterqueira
		public function setPriceOnClean(Price:Number):void {
			_price_on_clean = Price;
		}
		
		// Saldo ganho ao limpar a esterqueira
		public function getPriceOnClean():Number {
			return _price_on_clean;
		}
		
		// Verifica se a esterqueira está cheia
		public function isFull():Boolean {
			if (_state == 13)
				return true;
			return false;
		}
		
		// Limpa a esterqueira
		// e o jogador ganha dinheiro pelos estercos
		public function clean():void {
			_state = 0;
			this.play("normal");
			Farm.setMoney(Farm.getMoney() + 200);
			_clean_count++;
		}
		
		// Método chamado quando o objeto está selecionado
		public function selected():void {
			if (PhaseState.getMiddenSelected()) {
				if (!_is_selected) {					
					PhaseState.getMiddenSelected().visible = true;
					_is_selected = true;
				}
			}
		}
		
		// Método chamado para deselecionar o objeto
		public function unselected():void {
			if (PhaseState.getMiddenSelected()) {
				if (_is_selected) {
					PhaseState.getMiddenSelected().visible = false;
					_is_selected = false;
				}
			}
		}
		
		// Inidica se o objeto está selecionado
		public function isSelected():Boolean {
			return _is_selected;
		}
		
		// Recebe um novo item
		public function dropItem(Item:*):void {
			// Se o item estiver em bom estado
			// ganha dinheiro, senão perde
			if (Item.isGood()) {
				_state++;
				if (_state <= 13) {
					this.play(String(_state));
				}
				Farm.setMoney(Farm.getMoney() + Item.getPrice());
			} else {
				Farm.setMoney(Farm.getMoney() - Item.getPrice());
			}
			
			// Remove o item
			Item.kill();
		}
	}
}